--[[ doc
-- LibDataBrokerToTitan, a "bridge" module to ensure proper
-- registration and communication of LDB plugins with
-- Titan Panel
--
-- supported LDB types per 1.1 LDB spec
--
-- Only LDB types listed in the LDB spec are supported.
-- Custom types are not supported
--
-- Supported
-- "launcher" 
--    icon* - always shown
--    OnClick* - 
--    label^ - 
--    right side^ - default
--    tooltip
-- "data source" plugins with icon; a tooltip/Click; and optional label
--    icon^ - 
--    OnClick - 
--    text*^ - or value & suffix
--    label^ - 
--    OnEnter - 
--    OnLeave - 
--    tooltip
--    OnTooltipShow -
--
-- * required by LDB spec
-- ^ user controlled show / hide
--]]

--[[ doc
-----------------------------------------------------------------
--   By Titan Dev team
--   Originally by Tristanian aka "TristTitan" as a Titan member
--   Created and initially commited on : July 29th, 2008
-----------------------------------------------------------------
--]]
local xcategories = {
-- Titan categories mapping to match addon metadata information
	["Combat"] = "Combat",
	["General"] = "General",
	["Information"] = "Information",
	["Interface"] = "Interface",
	["Profession"] = "Profession",
-- Ace2 table mapping to Titan categories in order to match 
-- addon metadata information
	["Action Bars"] = "Interface",
	["Auction"] = "Information",
	["Audio"] = "Interface",
	["Battlegrounds/PvP"] = "Information",
	["Buffs"] = "Information",
	["Chat/Communication"] = "Interface",
	["Druid"] = "Information",
	["Hunter"] = "Information",
	["Mage"] = "Information",
	["Paladin"] = "Information",
	["Priest"] = "Information",
	["Rogue"] = "Information",
	["Shaman"] = "Information",
	["Warlock"] = "Information",
	["Warrior"] = "Information",
	["Healer"] = "Information",
	["Tank"] = "Information",
	["Caster"] = "Information",
--	["Combat"] = "Combat",
	["Compilations"] = "General",
	["Data Export"] = "General",
	["Development Tools "] = "General",
	["Guild"] = "Information",
	["Frame Modification"] = "Interface",
	["Interface Enhancements"] = "Interface",
	["Inventory"] = "Information",
	["Library"] = "General",
	["Map"] = "Interface",
	["Mail"] = "Information",
	["Miscellaneous"] = "General",
	["Misc"] = "General",
	["Quest"] = "Information",
	["Raid"] = "Information",
	["Tradeskill"] = "Profession",
	["UnitFrame"] = "Interface",
}
local LAUNCHER = "launcher"
local DATA_SOURCE = "data source"
local SupportedDOTypes = {DATA_SOURCE, LAUNCHER} -- in the 1.1 spec

-- constants & variables
local CALLBACK_PREFIX = "LibDataBroker_AttributeChanged_"
local NAME_PREFIX = "" --"LDBT_"
local _G = getfenv(0);
local InCombatLockdown	= _G.InCombatLockdown;
local LDBToTitan = CreateFrame("Frame", "LDBTitan")
local ldb = LibStub:GetLibrary("LibDataBroker-1.1")
local Tablet, LibQTip = nil, nil
local media = LibStub("LibSharedMedia-3.0")
local AceTimer = LibStub("AceTimer-3.0")
-- generic icon in case the DO does not provide one
local iconTitanDefault = "Interface\\PVPFrame\\\PVP-ArenaPoints-Icon"; 

-- Events we want for LDBToTitan
LDBToTitan:RegisterEvent("PLAYER_LOGIN")
LDBToTitan:RegisterEvent("PLAYER_ENTERING_WORLD")

-- Functions to properly anchor tooltips of Titan (LDB) objects with a 
-- generic frame and function as args
function LDBToTitan:TitanLDBSetOwnerPosition(parent, anchorPoint, relativeToFrame, relativePoint, xOffset, yOffset, frame)
	if frame:GetName() == "GameTooltip" then
		frame:SetOwner(parent, "ANCHOR_NONE");
		-- set alpha (transparency) for the Game Tooltip
		local red, green, blue = GameTooltip:GetBackdropColor();
		local red2, green2, blue2 = GameTooltip:GetBackdropBorderColor();
		frame:SetBackdropColor(red,green,blue,TitanPanelGetVar("TooltipTrans"));
		frame:SetBackdropBorderColor(red2,green2,blue2,
			TitanPanelGetVar("TooltipTrans"));

		-- set font size for the Game Tooltip
		if not TitanPanelGetVar("DisableTooltipFont") then
			if TitanTooltipScaleSet < 1 then
				TitanTooltipOrigScale = GameTooltip:GetScale();
				TitanTooltipScaleSet = TitanTooltipScaleSet + 1;
			end
			frame:SetScale(TitanPanelGetVar("TooltipFont"));
		end
	end
	frame:ClearAllPoints();
	frame:SetPoint(anchorPoint, relativeToFrame, relativePoint, xOffset, yOffset);
end

-- Position the tooltip for the Titan button
function LDBToTitan:TitanLDBSetTooltip(name, frame, func)
-- Check to see if we allow tooltips to be shown
	if not TitanPanelGetVar("ToolTipsShown") 
	or (TitanPanelGetVar("HideTipsInCombat") and InCombatLockdown()) then 
		return 
	end

	local button = TitanUtils_GetButton(name);
	local scale = TitanPanelGetVar("Scale");	
	local offscreenX, offscreenY;
	local i = TitanPanel_GetButtonNumber(name);
	local bar = TITAN_PANEL_DISPLAY_PREFIX..TitanUtils_GetWhichBar(name)
	local vert = TitanBarData[bar].vert
	-- Get TOP or BOTTOM for the anchor and relative anchor
	local rel_pt, pt
	if vert == TITAN_TOP then
		pt = "TOP"
		rel_pt = "BOTTOM"
	else
		pt = "BOTTOM"
		rel_pt = "TOP"
	end
	
	if _G[bar] then
		self:TitanLDBSetOwnerPosition(button, pt.."LEFT", button:GetName(), 
			rel_pt.."LEFT", -10, 0, frame);	-- y 4 * scale
		-- Adjust frame position if it's off the screen
		offscreenX, offscreenY = TitanUtils_GetOffscreen(frame);
		if ( offscreenX == -1 ) then
			self:TitanLDBSetOwnerPosition(button, pt.."LEFT", bar, 
				rel_pt.."LEFT", 0, 0, frame);
		elseif ( offscreenX == 1 ) then
			self:TitanLDBSetOwnerPosition(button, pt.."RIGHT", bar, 
				rel_pt.."RIGHT", 0, 0, frame);
		end
	else
	end

	if func then func(frame) end;
	frame:Show();
end

-- Script Handler goes here 
function LDBToTitan:TitanLDBHandleScripts(event, name, _, func, obj)
	--DEFAULT_CHAT_FRAME:AddMessage("LDB:"..name..".".. event.. " is fired.")
	local TitanPluginframe = _G["TitanPanel"..NAME_PREFIX..name.."Button"];

	-- This implementation will work fine for a static tooltip
	-- but may have implications for dynamic ones
	-- so for now, we'll only set it once (no callback) and see what happens
	
	-- tooltip
	if event:find("tooltip") and not event:find("OnTooltipShow") then		
		local pluginframe = _G[obj.tooltip] or obj.tooltip
		if pluginframe then
			TitanPluginframe:SetScript("OnEnter", function(self)
				TitanPanelButton_OnEnter(self);
				LDBToTitan:TitanLDBSetTooltip(NAME_PREFIX..name, pluginframe, nil)
				end
				)

			TitanPluginframe:SetScript("OnMouseDown", function(self)
				pluginframe:Hide();			 		
				end
				)	

			if pluginframe:GetScript("OnLeave") then
				-- do nothing
			else
				TitanPluginframe:SetScript("OnLeave", function(self)
					if obj.OnLeave then
						obj.OnLeave(self)
					end
					pluginframe:Hide();
					TitanPanelButton_OnLeave(self);
					end
					)
			end

			if pluginframe:GetName()~="GameTooltip" then
				if pluginframe:GetScript("OnShow") then
					-- do nothing
				else
					pluginframe:SetScript("OnShow", function(self)
						LDBToTitan:TitanLDBSetTooltip(NAME_PREFIX..name, pluginframe, nil)
						end
						)
				end
			end			 		       			        			 	
		end

	-- OnTooltipShow
	elseif event:find("OnTooltipShow") then
		TitanPluginframe:SetScript("OnEnter", function(self)
			if TITAN_PANEL_MOVING == 0 and func then				
				LDBToTitan:TitanLDBSetTooltip(NAME_PREFIX..name, GameTooltip, func);
			end
				TitanPanelButton_OnEnter(self);
			end
			)
		TitanPluginframe:SetScript("OnLeave", function(self) 
			GameTooltip:Hide();
			TitanPanelButton_OnLeave(self);
			end
			)

	-- OnDoubleClick
	elseif event:find("OnDoubleClick") and not event:find("OnClick") then
		TitanPluginframe:SetScript("OnDoubleClick", function(self, button)
			if TITAN_PANEL_MOVING == 0 then
				func(self, button) 
			end	  	
			end
			)	
		
	-- OnClick
	elseif event:find("OnClick") then
		TitanPluginframe:SetScript("OnClick", function(self, button)
			if TITAN_PANEL_MOVING == 0 then
				func(self, button) 
			end
			-- implement a safeguard, since the DO may actually use 
			-- Blizzy dropdowns !
			if not TitanPanelRightClickMenu_IsVisible() then
				TitanPanelButton_OnClick(self, button);
			else
				TitanUtils_CloseAllControlFrames();
			end
			end
			)	  
	-- OnEnter
	else
		TitanPluginframe:SetScript("OnEnter", function(self)
			-- Check for tooltip libs without embedding them 
			if AceLibrary and AceLibrary:HasInstance("Tablet-2.0") then 
				Tablet = AceLibrary("Tablet-2.0") 
			end
			LibQTip = LibStub("LibQTip-1.0", true)
			-- Check to see if we allow tooltips to be shown
			if not TitanPanelGetVar("ToolTipsShown") 
			or (TitanPanelGetVar("HideTipsInCombat") and InCombatLockdown()) then
				-- if a plugin is using tablet, then detach and close the tooltip
				if Tablet and Tablet:IsRegistered(TitanPluginframe) 
				and Tablet:IsAttached(TitanPluginframe) then
					Tablet:Detach(TitanPluginframe);
					Tablet:Close(TitanPluginframe);
				end
				return;
			else			
				-- if a plugin is using tablet, then re-attach the tooltip 
				-- (it will auto-open on mouseover)
				if Tablet and Tablet:IsRegistered(TitanPluginframe) 
				and not Tablet:IsAttached(TitanPluginframe) then
					Tablet:Attach(TitanPluginframe);
				end
			end
			-- if a plugin is using tablet then set its transparency 
			-- and font size accordingly
			if Tablet and Tablet:IsRegistered(TitanPluginframe) then
				Tablet:SetTransparency(TitanPluginframe, TitanPanelGetVar("TooltipTrans"))
				if not TitanPanelGetVar("DisableTooltipFont") then
					Tablet:SetFontSizePercent(TitanPluginframe, TitanPanelGetVar("TooltipFont"))
				elseif TitanPanelGetVar("DisableTooltipFont") 
				and Tablet:GetFontSizePercent(TitanPluginframe)~=1 then
					Tablet:SetFontSizePercent(TitanPluginframe, 1)
				end				
			end
			-- set original tooltip scale for GameTooltip
			if not TitanPanelGetVar("DisableTooltipFont") then
				TitanTooltipOrigScale = GameTooltip:GetScale();
			end
			-- call OnEnter on LDB Object
			if TITAN_PANEL_MOVING == 0 and func then
				func(self)
			end
			TitanPanelButton_OnEnter(self);			
			-- LibQTip-1.0 support code
			if LibQTip then
				local tt = nil
				local key, tip
				for key, tip in LibQTip:IterateTooltips() do
					if tip then
						local _, relativeTo = tip:GetPoint()
						if relativeTo 
						and relativeTo:GetName() == TitanPluginframe:GetName() then
							tt = tip
							break
						end
					end
				end
				if tt then
					-- set transparency
					local red, green, blue, _ = tt:GetBackdropColor()
					local red2, green2, blue2, _ = tt:GetBackdropBorderColor()
					tt:SetBackdropColor(red,green,blue,
						TitanPanelGetVar("TooltipTrans"))
					tt:SetBackdropBorderColor(red2,green2,blue2,
						TitanPanelGetVar("TooltipTrans"))				
				end
			end
			-- /LibQTip-1.0 support code
			end
			)
		
	-- OnLeave
		TitanPluginframe:SetScript("OnLeave", function(self)
			if obj.OnLeave then 
				obj.OnLeave(self) 
			end
			TitanPanelButton_OnLeave(self);
			end
			)
	end
end

-- LDB Text callback when the LDB addon changes display text
function LDBToTitan:TitanLDBTextUpdate(_, name,  attr, value, dataobj)
	-- just in case the LDB is active before Titan can register it...
	if not Titan__InitializedPEW then
		-- plugins have not been registered yet.
		return
	end
	-- This check is overkill but just in case...
	local plugin = TitanUtils_GetPlugin(NAME_PREFIX..name)
	local ldb = plugin and plugin.LDBVariables
	if not ldb then
		-- This plugin has not been registered
		return
	end

	-- Accept the various display elements and update the Titan plugin
	if attr == "value" then ldb.value = value end
	if attr == "suffix" then ldb.suffix = value end
	if attr == "text" then ldb.text = value end
	if attr == "label" then ldb.label = value end
	
	-- Now update the button with the change
	TitanPanelButton_UpdateButton(NAME_PREFIX..name)
end

-- Titan Text callback
function TitanLDBShowText(name)
	-- Set 'label1' and 'value1' for the Titan button display
	local nametrim = string.gsub (name, "LDBT_", "");
	local fontstring = _G["TitanPanel"..NAME_PREFIX..nametrim.."ButtonText"];
	local separator = ": "
	local lab1, val1 = "", ""
	local plugin = TitanUtils_GetPlugin(name)
	local ldb = plugin and plugin.LDBVariables

	if ldb then -- sanity check
		-- Check for display label
		if TitanGetVar(name, "ShowLabelText") then
			lab1 = (ldb.label or "")
		else
			lab1 = ""
		end

		if lab1 == "" then
			-- leave alone
		else
			lab1 = lab1..separator
		end

		-- Check for display text
		if TitanGetVar(name, "ShowRegularText") then
			-- One interpretation of 1.1 spec is 
			-- either use .text or use .value & .suffix
			-- another is always use .text but .value & .suffix are parts if needed
			if ldb.suffix and ldb.suffix ~="" then   	
				val1 = (ldb.value or "").." "..ldb.suffix
			else    
				val1 = (ldb.text or "")
			end
		end
	else
		-- return values will be empty strings
	end
	
	if lab1 == "" then
		lab1 = nil
	else
		lab1 = TitanUtils_GetNormalText(lab1)
	end
	if val1 == "" then
		val1 = nil
	else
		val1 = TitanGetVar(name, "ShowColoredText") 
			and TitanUtils_GetGreenText(val1) or TitanUtils_GetHighlightText(val1)
	end
	return lab1, val1
end

-- LDB Icon callback when the LDB addon changes its icon
function LDBToTitan:TitanLDBIconUpdate(_, name,  attr, value, dataobj)
	-- just in case the LDB is active before Titan can register it...
	if not Titan__InitializedPEW then
		-- no plugins are registered yet
		return
	end
	-- This check is overkill but just in case...
	local plugin = TitanUtils_GetPlugin(NAME_PREFIX..name)
	local ldb = plugin and plugin.LDBVariables
	if not ldb then
		-- This plugin is not registered yet
		return
	end

	if attr == "icon" then
		TitanPlugins[NAME_PREFIX..name].icon = value;
		TitanPanelButton_SetButtonIcon(NAME_PREFIX..name);
	end

	-- support for iconCoords, iconR, iconG, iconB attributes
	if attr == "iconCoords" then
		TitanPanelButton_SetButtonIcon(NAME_PREFIX..name, value);
	end

	if attr == "iconR" or attr == "iconB" or attr == "iconG" then 
		TitanPanelButton_SetButtonIcon(NAME_PREFIX..name, nil, 
			dataobj.iconR, dataobj.iconG, dataobj.iconB);
	end
end

-- Refresh all text & icon for LDB addons that were successfully registered
function TitanLDBRefreshButton()
	-- Ensure all the LDB buttons are updated 
	-- This is called once x seconds after PEW. This helps close the gap where LDB
	-- addons set their text on their PEW event
	for name, obj in ldb:DataObjectIterator() do
		if obj then
			LDBToTitan:TitanLDBTextUpdate(_, name, "text", (obj.text or ""), obj)
			LDBToTitan:TitanLDBIconUpdate(_, name, "icon", (obj.icon or iconTitanDefault), obj)
		else
--	DEFAULT_CHAT_FRAME:AddMessage("LDB: '"..name.."' no refresh")
		end
	end
end

-- New DO gets created here
function LDBToTitan:TitanLDBCreateObject(_, name, obj)
   --DEFAULT_CHAT_FRAME:AddMessage("Attempting to register "..name..".");
	
	-- couple sanity checks
   if not obj or not name then
--		TitanDebug(.."LDB request to create Titan plugin was unrecognizable!!!!")
		return
	end
	
	-- anything to pass to the developer / user
	local notes = ""
	
	-- sanity check for supported types
	obj.type = obj.type or "Unknown"
	local supported = false -- assume failure
	for idx in ipairs(SupportedDOTypes) do
		if obj.type and obj.type == SupportedDOTypes[idx] then
			supported = true
		end
	end
	if supported then
		-- all is good - continue plugin creation
	else
		-- Create enough of a plugin to tell the user / developer
		-- that this plugin falied miserably
		local plugin = 
			{
			self = nil,
			button = nil,
			isChild = nil,
			name = (name or "?"),
			issue = "Unsupported LDB type '"..obj.type.."'", 
			notes = "", 
			status = TITAN_REGISTER_FAILED,
			category = nil,
			plugin_type = obj.type,
			}
		TitanUtils_PluginFail(plugin)
		return -- get out, there is nothing more that can be done
	end

	--
	-- Handle the display attributes of the DO and register the appropriate callbacks
	--
	-- Init the display elements of the plugin
	local ldb__label = obj.label or ""
	local ldb__suffix = obj.suffix or ""
	local ldb__value = obj.value or ""
	local ldb__text = obj.text or ""
	local ldb__icon = obj.icon or iconTitanDefault

	-- if .icon exists honor it and assume the addon may change it
	if obj.icon then
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_icon", "TitanLDBIconUpdate")
	end
	
	-- LAUNCHER text display elements
	if obj.type == LAUNCHER then
		if obj.label then
			ldb.RegisterCallback(self, 
				CALLBACK_PREFIX..name.."_label", "TitanLDBTextUpdate")
		elseif obj.text then
			-- This is a 'be nice' check. It technically violates the 1.1 spec.
			-- Blank the .text so the rest of the routines work
			ldb__label = obj.text
			obj.text = ""
			ldb.RegisterCallback(self, 
				CALLBACK_PREFIX..name.."_text", "TitanLDBTextUpdate")
			notes = notes.."\n"
				.."This is a LDB '"..LAUNCHER
				.."' without .label using .text instead!!!!"
		end
	end
	if Titan__InitializedPEW then
		notes = notes.."\n"
			.."Will be registered as single LDB plugin after the normal registration."
	end
	-- DATA_SOURCE text display elements
	if obj.type == DATA_SOURCE then
		-- .text so always allow it
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_text", "TitanLDBTextUpdate")
		if obj.label then
			ldb.RegisterCallback(self, 	
				CALLBACK_PREFIX..name.."_label", "TitanLDBTextUpdate")
		end
		if obj.suffix then
			ldb.RegisterCallback(self, 
				CALLBACK_PREFIX..name.."_suffix", "TitanLDBTextUpdate")
		end
		if obj.value then
			ldb.RegisterCallback(self, 
				CALLBACK_PREFIX..name.."_value", "TitanLDBTextUpdate")
		end
	end
	
	--
	-- These are icon extensions listed within the 1.1 spec
	--
	-- support for iconCoords, iconR, iconG, iconB attributes
	-- Due to the callbacks being fired these can easily affect 
	-- performance, BEWARE when using them !
	if obj.iconCoords then
		self:TitanLDBIconUpdate(nil, name, "iconCoords", obj.iconCoords, obj)
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_iconCoords", "TitanLDBIconUpdate")
	end
	if obj.iconR and obj.iconG and obj.iconB then
		self:TitanLDBIconUpdate(nil, name, "iconR", obj.iconR, obj)
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_iconR", "TitanLDBIconUpdate")
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_iconG", "TitanLDBIconUpdate")
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_iconB", "TitanLDBIconUpdate")
	end

	--
	-- Setup the Titan plugin for this LDB addon
	--

	-- Create the appropriate Titan registry for the DO
	local registry = {
		id = NAME_PREFIX..name,
		ldb = tostring(obj.type),
		-- per 1-1 spec if .label use it else use data object's name
		menuText = obj.label or name, 
		buttonTextFunction = "TitanLDBShowText", 
		icon = ldb__icon,     
		iconWidth = 16,          
		controlVariables = {
			ShowIcon = true,
			ShowLabelText = true,
			ShowRegularText = false,
			ShowColoredText = false,
			DisplayOnRightSide = true
		},
		savedVariables = {
			ShowIcon = true,
			ShowLabelText = true,
			ShowRegularText = true,
			ShowColoredText = false,
			DisplayOnRightSide = false
		},
		LDBVariables = {
			value = ldb__value,
			suffix = ldb__suffix,
			text = ldb__text,
			label = ldb__label,
			name = name,
			type = (obj.type or ""),
		},
		notes = notes,
	};

	-- Set the plugin category, if it exists else default to "General"
	-- Per the 1.1 LDB spec we check for a tocname attrib first, 
	-- if found we use it, if not we assume that the DO "name" 
	-- attribute is the same with the actual
	-- addon name, which might not always be the case.
	-- Titan defaults again to "General" if no categoy is found
	-- via a check in the menu implementation, later on.
	local addoncategory, addonversion;
	local tempname = obj.tocname or name;
	if IsAddOnLoaded(tempname) then
		addoncategory = GetAddOnMetadata(tempname, "X-Category");
		registry["category"]= addoncategory and xcategories[addoncategory] or nil
		addonversion = GetAddOnMetadata(tempname, "Version");
		registry["version"]= addonversion or nil;
	end

	-- Depending on the LDB type set the control and saved Variables appropriately
	if obj.type == LAUNCHER then
		-- controls
		-- one interpretation of the LDB spec is launchers 
		-- should always have an icon.
		registry["controlVariables"].ShowIcon = false;
		registry["controlVariables"].ShowRegularText = false; -- no text
		-- defaults
		registry["savedVariables"].ShowRegularText = false;
		registry["savedVariables"].DisplayOnRightSide = true; -- start on right side
	end
 
	if obj.type == DATA_SOURCE then
		-- controls
		registry["controlVariables"].ShowRegularText = true;
		-- defaults
		registry["savedVariables"].ShowRegularText = true;
	end
 
	--
	-- Create the frame for this LDB addon
	--
	
	-- Create the Titan Frame as a Combo
	-- Titan _OnLoad will be used to request the plugin be registered by Titan
	local newTitanFrame = CreateFrame("Button",
		"TitanPanel"..NAME_PREFIX..name.."Button", 
		UIParent, "TitanPanelComboTemplate")
	newTitanFrame.registry = registry
	newTitanFrame:SetFrameStrata("FULLSCREEN");
	newTitanFrame:SetToplevel(true);
	newTitanFrame:RegisterForClicks("LeftButtonUp", "RightButtonUp");

	-- Use the routines given by the DO in this precedence 
	-- tooltip > OnEnter > OnTooltipShow > 
	-- or register a callback in case it is created later. Per the 1.1 LDB spec
	if obj.tooltip then       
		self:TitanLDBHandleScripts("tooltip", name, nil, obj.tooltip, obj)
	elseif obj.OnEnter then       
		self:TitanLDBHandleScripts("OnEnter", name, nil, obj.OnEnter, obj)
	elseif obj.OnTooltipShow then
		self:TitanLDBHandleScripts("OnTooltipShow", name, nil, obj.OnTooltipShow, obj)
	else
		self:TitanLDBHandleScripts("OnEnter", name, nil, nil, obj)
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_OnEnter", "TitanLDBHandleScripts")
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_OnTooltipShow", "TitanLDBHandleScripts")
	end

	-- Use the OnClick given by the DO 
	-- or register a callback in case it is created later.
	if obj.OnClick then
		self:TitanLDBHandleScripts("OnClick", name, nil, obj.OnClick)
	else
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_OnClick", "TitanLDBHandleScripts")
	end

	--
	-- OnDoubleClick is UNDOCUMENTED in the 1.1 spec 
	-- but was implemented by the original developer
	--
	-- Use the OnDoubleClick given by the DO 
	-- or register a callback in case it is created later.
	if obj.OnDoubleClick then
		self:TitanLDBHandleScripts("OnDoubleClick", name, nil, obj.OnDoubleClick)
	else
		ldb.RegisterCallback(self, 
			CALLBACK_PREFIX..name.."_OnDoubleClick", "TitanLDBHandleScripts")
	end

	-- If plugins have already been registered and loaded then get this one loaded
	-- This works because the .registry is now set
	if Titan__InitializedPEW then
		TitanPanel_PlayerEnteringWorld()
	end
end

-- OnEvent handler for LDBToTitan
LDBToTitan:SetScript("OnEvent", function(self, event, ...)
	if (event == "PLAYER_LOGIN") then	 
		self:UnregisterEvent("PLAYER_LOGIN")
		-- In case a LDB plugin is created later...
		ldb.RegisterCallback(self, 
			"LibDataBroker_DataObjectCreated", "TitanLDBCreateObject")
		
		-- Register the LDB plugins that have been created so far
		for name, obj in ldb:DataObjectIterator() do
			self:TitanLDBCreateObject(nil, name, obj)
			--DEFAULT_CHAT_FRAME:AddMessage("Registered "..name..".");
		end
	end
	
	if (event == "PLAYER_ENTERING_WORLD") then	 
		self:UnregisterEvent("PLAYER_ENTERING_WORLD")
		-- Ensure all plugins (for LDB) are refreshed.
		-- Some LDB plugins may have updated text, icon, etc 
		-- before the plugin was registered so be nice and schedule a refresh
		AceTimer.ScheduleTimer("LDBToTitanSetText", TitanLDBRefreshButton, 2);
	end
	end
)